1.Definitie Se numeste lista o structura de date omogene ce memoreaza o succesiune de obiecte(numite noduri) intre care exista o relatie de ordonare. A=(a1,a2,a3,..an)
omogene=fiecare element al multimii are acceasi componenta relatie de ordonare=fiecare element din interiorul listei are predecesor si succesor
Acestea sunt folosite la implementarea mai multor structuri de date. Spre exemplu: - grafuri (liste de adiacenta) - cozi - stive
2. Implementare 2.1 Liste alocate secvenţial = nodurile listei ocupă poziţii succesive în memorie, se realizează prin alocare statică întâlnită la vectori. Exemplu 2.2 Liste alocate înlănţuit care pot implementate static sau dinamic.
Listele inlănţuite pot fi: A. Liste generale: a. lista simplu inlănţuită b. lista dublu înlănţuită c. lista circulara B. Liste restrictive a. Stiva b. Coada
Liste liniare simplu inlantuite implementate dinamic:
Listele simplu inlantuite sunt structuri de date dinamice omogene. Spre deosebire de masive, listele nu sunt alocate ca blocuri omogene de memorie, ci ca elemente separate de memorie. Fiecare nod al listei contine, in afara ce informatia utila, adresa urmatorului element. Aceasta organizare permite numai acces secvential la elementele listei.
Pentru accesarea listei trebuie cunoscuta adresa primului element (numita capul listei); elementele urmatoare sunt accesate parcurgand lista.
Pentru crearea listei se va crea mai întâi primul nod al listei. Fie po variabilă pointer (de tip referinţă) care va indica mereu adresa primului nod al listei şi q o variabilă pointer auxiliară tot de tipreferinţă. Să considerăm că avem creat cel puţin primul nod al listei. Pentru adăugarea unui nou nod la începutul listei trebuie să procedăm astfel: generăm o nouă locaţie de memorie cu aceeaşi structură a cărei adresă o memorăm într-o variabilă de tip pointer q; pregătim câmpul cheie şi câmpul info al variabilei pointer q;în câmpul urm al acestui nod trebuie să punem adresa primului nod p; în final, lui p îi atribuim adresa noului nod care devine acum primul.
Operatiile care se pot efectua asupra listelor simplu înlantuite sunt: adaugarea unui element la lista, stergerea unui element din lista si cautarea dupa anumite criterii. Pentru toate aceste operatii se considera ca exista o variabila, prim, care memoreaza începutul listei (adresa primului element), iar elementele sunt definite prin urmatoarea structura:
unde prim va fi utilizata pentru memorarea primului element,
Operația de adăugare noduri
1. Adaugarea primului element in lista Pentru a insera primul element la începutul listei trebuie alocat spatiu de memorie pentru un nou element.
Subprogramul pentru adaugarea primului nod cu informatia x in lista:
void initializare(int x)//adaugare primului nod cu informatia x in lista
{
prim=new nod;
prim->inf=x;
prim->next=NULL;
}
2.Adaugarea unui nod la începutul listei
Pentru a insera un nod la începutul listei trebuie alocat spatiu de memorie pentru un nou element si creata legatura între noul element si primul element din lista.
int esteVida()//verificare daca lista nu contine noduri
{
return prim==NULL;
}
void adaugaInceput(int x)//adaugare la inceputul listei
{
nod *p;
if(esteVida())//nu am noduri in lista
initializare(x);
else{
p=new nod;
p->inf=x;
p->next=prim;
prim=p;
} }
3. Adaugarea unui element la sfârsitul listei Pentru aceasta operatie trebuie parcursa lista pâna la ultimul element care va fi legat de un element nou creat. Instructiunile sunt:
void adaugaFinal(int x)//adaugarea unui nod la finalul listei nod
{
nod *p,*q=prim;
if (esteVida())//nu am noduri in lista
initializare(x);
else//am deja noduri in lista
{
p=new nod;//aloc memorie pentru un nod nou
p->inf=x;//adaug informatia in nod
p->next=NULL;
while(q->next!=NULL)//ma pozitionez pe ultimul nod in lista
q=q->next;
q->next=p;//leg ultimul nod din lista de noul nod creat
}
}
4. Adaugarea unui element dupa elementul care îndeplineste o anumita conditie Pentru aceasta operatie trebuie: -parcursa lista pâna la gasirea elementui cautat, astfel încât indicatorul sa se opreasca pe elementul care indeplineste conditia; -se creeaza un nou element si se vor crea legaturile (elementul indicat este legat de elementul nou si elementul nou este legat de urmatorul element din lista). Subprogramul pentru adaugarea nodului cu informatia x dupa nodul cu informatia n
5. Adaugarea unui element inainte de elementul care îndeplineste o anumita conditie Pentru aceasta operatie trebuie: -parcursa lista pâna la gasirea elementui inaintea celui cautat, astfel încât indicatorul sa se opreasca pe elementul anterior celui care indeplineste conditia; -se creeaza un nou element si se vor crea legaturile (elementul indicat este legat de elementul nou si elementul nou este legat de urmatorul element din lista). Subprogramul pentru adaugarea nodului cu informatia x inainte de nodul cu informatia n
void adaugaInainteNod(int x, int n)
{
if(esteVida()) initializare(x);
else{
if (prim->inf == n)
adaugaInceput(x);
else
{nod *q = prim;
while (q->next->inf!= n)
q = q->next;
nod *aux = new nod;
aux->inf=x;
aux->next = q->next;
q->next = aux;}}}
Operatia de stergere din lista
6. Stergerea primului element din lista Presupune crearea legaturii între elementul anterior elementului sters si cel urmator. Se va face distictie între primul element si celelalte elemente din lista.Memoria ocupata de nod trebuie eliberata la stergere prin comanda delete.
7. Stergerea nodului cu informatia x Presupune crearea legaturii între elementul anterior elementului sters si cel urmator. Se va face distictie între primul element si celelalte elemente din lista.Memoria ocupata de nod trebuie eliberata la stergere prin comanda delete.
void stergere(int x)
{
if (prim->inf == x)
{nod *aux = prim;
prim = prim->next;
delete aux;
}
else
{nod *q = prim;
while (q->next!=NULL && q->next->inf != x ) //daca data din elementul urmator este egala cu x
q = q->next;
if(q->next==NULL)
cout<<" nu exista nodul "<<x<<endl;
else{
nod *aux = q->next;
q->next = q->next->next;
delete aux;
}
}
}
Operatia de afisare a listei
void afisare()//afisare lista
{
nod *p=prim;
while(p)// am noduri in lista
{
cout<<p->inf<<" ";
p=p->next;
}
cout<<endl;
}
Sa se construiasca o lista liniara simplu inlantuita care sa contina o secventa de numere intregi citite din fisierul lista.txt . Construiti subprograme adecvate astfel incat:
Sa se afiseze elementele listei
Sa se afiseze numarul de noduri din lista
Sa se testeze daca x-numar intreg citit de la tastatura se gaseste in lista.
Sa se separe elementele pare de cele impare in 2 liste separate.
Modificati lista initiala astfel incat sa se insereze dupa fiecare nod care memoreaza o valoare para un nod care sa memoreze jumatate din valoarea acestuia
Stergeti din lista initiala nodurile cu valori pare.
2. Sa se creeze o lista liniara simplu inlantuita care sa memoreze urmatoarele informatii despre elevii unei clase formata din n elevi:
- numele (sir de maxim 20 de caractere)
- prenumele (sir de maxim 20 de caractere)
- 3 note intr-un vector cu 3 componente reale
b) Sa se afiseze numele, prenumele si media fiecarui elev.
c) Sa se scrie o functie care calculeaza si returneaza media clasei. Solutie...+ fisier elevi.txt
3. Intr-un fisier text se gasesc numere naturale. Sa se ordoneze crescator numerele din fisier folosind o lista liniara simplu inlantuita. Se va folosi metoda sortarii prin insertie.
1.Definitie
Se numeste lista o structura de date omogene ce memoreaza o succesiune de obiecte(numite noduri) intre care exista o relatie de ordonare.
A=(a1,a2,a3,..an)
omogene=fiecare element al multimii are acceasi componenta
relatie de ordonare=fiecare element din interiorul listei are predecesor si succesor
Acestea sunt folosite la implementarea mai multor structuri de date. Spre exemplu:
- grafuri (liste de adiacenta)
- cozi
- stive
2. Implementare
2.1 Liste alocate secvenţial = nodurile listei ocupă poziţii succesive în memorie, se realizează prin alocare statică întâlnită la vectori.
Exemplu
2.2 Liste alocate înlănţuit care pot implementate static sau dinamic.
Listele inlănţuite pot fi:
A. Liste generale:
a. lista simplu inlănţuită
b. lista dublu înlănţuită
c. lista circulara
B. Liste restrictive
a. Stiva
b. Coada
Liste liniare simplu inlantuite implementate dinamic:
Listele simplu inlantuite sunt structuri de date dinamice omogene. Spre deosebire de masive, listele nu sunt alocate ca blocuri omogene de memorie, ci ca elemente separate de memorie. Fiecare nod al listei contine, in afara ce informatia utila, adresa urmatorului element. Aceasta organizare permite numai acces secvential la elementele listei.
Pentru accesarea listei trebuie cunoscuta adresa primului element (numita capul listei); elementele urmatoare sunt accesate parcurgand lista.
Pentru crearea listei se va crea mai întâi primul nod al listei. Fie po variabilă pointer (de tip referinţă) care va indica mereu adresa primului nod al listei şi q o variabilă pointer auxiliară tot de tipreferinţă. Să considerăm că avem creat cel puţin primul nod al listei. Pentru adăugarea unui nou nod la începutul listei trebuie să procedăm astfel: generăm o nouă locaţie de memorie cu aceeaşi structură a cărei adresă o memorăm într-o variabilă de tip pointer q; pregătim câmpul cheie şi câmpul info al variabilei pointer q;în câmpul urm al acestui nod trebuie să punem adresa primului nod p; în final, lui p îi atribuim adresa noului nod care devine acum primul.
Operatiile care se pot efectua asupra listelor simplu înlantuite sunt: adaugarea unui element la lista, stergerea unui element din lista si cautarea dupa anumite criterii.
Pentru toate aceste operatii se considera ca exista o variabila, prim, care memoreaza începutul listei (adresa primului element), iar elementele sunt definite prin urmatoarea structura:
struct nod{ <tip_de_data> inf; nod *next; }; nod *prim;unde prim va fi utilizata pentru memorarea primului element,Operația de adăugare noduri
1. Adaugarea primului element in lista
Pentru a insera primul element la începutul listei trebuie alocat spatiu de memorie pentru un nou element.
Subprogramul pentru adaugarea primului nod cu informatia x in lista:
void initializare(int x)//adaugare primului nod cu informatia x in lista { prim=new nod; prim->inf=x; prim->next=NULL; }2. Adaugarea unui nod la începutul listei
Pentru a insera un nod la începutul listei trebuie alocat spatiu de memorie pentru un nou element si creata legatura între noul element si primul element din lista.
int esteVida()//verificare daca lista nu contine noduri { return prim==NULL; }void adaugaInceput(int x)//adaugare la inceputul listei { nod *p; if(esteVida())//nu am noduri in lista initializare(x); else{ p=new nod; p->inf=x; p->next=prim; prim=p; } }3. Adaugarea unui element la sfârsitul listei
Pentru aceasta operatie trebuie parcursa lista pâna la ultimul element care va fi legat de un element nou creat.
Instructiunile sunt:
void adaugaFinal(int x)//adaugarea unui nod la finalul listei nod { nod *p,*q=prim; if (esteVida())//nu am noduri in lista initializare(x); else//am deja noduri in lista { p=new nod;//aloc memorie pentru un nod nou p->inf=x;//adaug informatia in nod p->next=NULL; while(q->next!=NULL)//ma pozitionez pe ultimul nod in lista q=q->next; q->next=p;//leg ultimul nod din lista de noul nod creat } }4. Adaugarea unui element dupa elementul care îndeplineste o anumita conditie
Pentru aceasta operatie trebuie:
-parcursa lista pâna la gasirea elementui cautat, astfel încât indicatorul sa se opreasca pe elementul care indeplineste conditia;
-se creeaza un nou element si se vor crea legaturile (elementul indicat este legat de elementul nou si elementul nou este legat de urmatorul element din lista).
Subprogramul pentru adaugarea nodului cu informatia x dupa nodul cu informatia n
void adaugaDupaNod(int x, int n) { if(esteVida()) initializare(x); else {nod *q = prim; while ( q && q->inf!= n) q = q->next; if(q==NULL) cout<<"Nu s-a gasit valoarea cautata"; else{ nod *aux = new nod; aux->inf=x; aux->next = q->next; q->next = aux;} } }5. Adaugarea unui element inainte de elementul care îndeplineste o anumita conditie
Pentru aceasta operatie trebuie:
-parcursa lista pâna la gasirea elementui inaintea celui cautat, astfel încât indicatorul sa se opreasca pe elementul anterior celui care indeplineste conditia;
-se creeaza un nou element si se vor crea legaturile (elementul indicat este legat de elementul nou si elementul nou este legat de urmatorul element din lista).
Subprogramul pentru adaugarea nodului cu informatia x inainte de nodul cu informatia n
void adaugaInainteNod(int x, int n) { if(esteVida()) initializare(x); else{ if (prim->inf == n) adaugaInceput(x); else {nod *q = prim; while (q->next->inf!= n) q = q->next; nod *aux = new nod; aux->inf=x; aux->next = q->next; q->next = aux;}}}Operatia de stergere din lista
6. Stergerea primului element din lista
Presupune crearea legaturii între elementul anterior elementului sters si cel urmator. Se va face distictie între primul element si celelalte elemente din lista.Memoria ocupata de nod trebuie eliberata la stergere prin comanda delete.
Instructiunile sunt:
void stergeInceput(){ nod *p=prim; if(esteVida()) cout<<"Lista este vida"<<endl; else{ prim=prim->next; delete p;} }7. Stergerea nodului cu informatia x
Presupune crearea legaturii între elementul anterior elementului sters si cel urmator. Se va face distictie între primul element si celelalte elemente din lista.Memoria ocupata de nod trebuie eliberata la stergere prin comanda delete.
void stergere(int x) { if (prim->inf == x) {nod *aux = prim; prim = prim->next; delete aux; } else {nod *q = prim; while (q->next!=NULL && q->next->inf != x ) //daca data din elementul urmator este egala cu x q = q->next; if(q->next==NULL) cout<<" nu exista nodul "<<x<<endl; else{ nod *aux = q->next; q->next = q->next->next; delete aux; } } }Operatia de afisare a listei
void afisare()//afisare lista { nod *p=prim; while(p)// am noduri in lista { cout<<p->inf<<" "; p=p->next; } cout<<endl; }Exemple de implementare:
Exercitii:
2. Sa se creeze o lista liniara simplu inlantuita care sa memoreze urmatoarele informatii despre elevii unei clase formata din n elevi:
- numele (sir de maxim 20 de caractere)
- prenumele (sir de maxim 20 de caractere)
- 3 note intr-un vector cu 3 componente reale
b) Sa se afiseze numele, prenumele si media fiecarui elev.
c) Sa se scrie o functie care calculeaza si returneaza media clasei.
Solutie...+ fisier elevi.txt
3. Intr-un fisier text se gasesc numere naturale. Sa se ordoneze crescator numerele din fisier folosind o lista liniara simplu inlantuita. Se va folosi metoda sortarii prin insertie.
4. Grile cu Liste
5. Test Liste